Skip to content

Promote: the Dogecoin and Zcash parity surfaces - #35

Merged
bitcoinuniverseadmin merged 21 commits into
mainfrom
develop
Aug 30, 2026
Merged

Promote: the Dogecoin and Zcash parity surfaces#35
bitcoinuniverseadmin merged 21 commits into
mainfrom
develop

Conversation

@bitcoinuniverseadmin

@bitcoinuniverseadmin bitcoinuniverseadmin commented Aug 30, 2026

Copy link
Copy Markdown

Promotes develop to main.

Since a2ae438, develop gained:

Depends on the overlay from backend-apis, already deployed and serving every data family these pages read.

Verified against the live origin with the deployed overlay: both dashboards, both mining pages, the chart shells and the docs render with no failure notice over real blocks and real pool attribution; chain switching preserves the section including chart children; and with every source forced down, each panel degrades on its own while the page and its navigation stay up.

Verified locally: 410 universe unit tests, the parity regression gate, the production build with its four artifact gates, the mobile gate across seven window sizes, and 92 visual-matrix screenshots at 320, 375 and 1440 in both themes with no overflow, console, accessibility or contrast finding, including the eight existing chain routes whose stylesheet was refactored.

🤖 Generated with Claude Code

bitcoinuniverseadmin and others added 6 commits August 30, 2026 07:39
The overlay published index-doge-tap as unreachable from the day it was
configured, and the hourly production smoke failed on it for a day, for two
reasons this file did not warn about.

The entry named http://127.0.0.1:3013 against a service that has served TLS
since its certificate was issued. Every probe got an empty reply, which the
overlay can only report as unreachable, and the service was running and ready
the whole time. The entry now names the certificate's own SAN host over
loopback, and the certificate is trusted rather than verification being
switched off.

The entry also carried the reader's token. The marketplace endpoints check a
per-authority token instead, so every checkpoint request was a 401 while the
unauthenticated readiness probe passed. A green readiness probe says nothing
about the request that actually matters.

Both are properties of the deployment rather than of the repository, which is
why they were invisible here. The configuration table also gains the
certificate file the overlay now reads.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…ge-tap-over-tls

Write down how a source entry reaches an authority that speaks TLS
The two chains rendered a capability report where Bitcoin renders a
dashboard, and their navigation hid Mining, Charts, and chain Docs
behind an activeChain gate. This builds the missing product:

- The route registry gains mining, graphs, and docs categories, chain
  switching preserves the section, and a chart child survives a switch
  when the destination chain has an equivalent (a registry maps
  block-sizes-weights to block-sizes and block-health to
  block-interval).
- The chain dashboard: a full-width block timeline with one cube per
  upcoming target slot and one per confirmed block, heights above every
  cube, the direction toggle shared with the Bitcoin strip, fee
  guidance in chain-native units, a Universe Lens over the real pending
  set (the Bitcoin treemap renderer fed chain-read items, with a table
  fallback), mining facts, recent blocks with evidence-based miner
  attribution, and the old capability report filed as a status drawer.
- Zcash slots state eligibility, never order: tier chips stay on the
  cubes and the strip says selection is randomized under ZIP-317.
- A chain mining page: network facts, rewards, pool shares with an
  honest Unknown bucket and named evidence, recent blocks, and a
  how-this-chain-mines explainer covering AuxPoW and Equihash.
- Chain charts: an echarts shell with ten chart routes per chain,
  ranges disabled until stored history covers them, table fallback,
  and a pool ranking page.
- Chain docs at /dogecoin/docs and /zcash/docs: fourteen sections from
  dashboard field definitions to the API list, privacy limits on
  Zcash, and the candidate-versus-projected distinction.
- The mempool page keeps its bucket row; the shared cube grammar and
  page skeleton move to partials so the surfaces cannot drift apart.
- Gates: parity-regressions.test.mjs pins the structure in CI, the
  production smoke checks the new data families with a
  backfilling-aware honesty rule, the browser smoke audits the
  rendered timeline, and the visual matrix covers the eight new routes
  in both themes with fixtures for every new endpoint.

Local verification: production build green, 407 universe unit tests,
40-screenshot visual run with zero contrast, a11y, overflow, and
console findings.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The mobile gate measured the range, window, lens, and navigation pills
at 31 pixels tall and as little as 39 wide, and the protocol and panel
links at 24 pixels. All of them repeat in a row or a column, which is
exactly the case the 44 pixel rule is about: a miss selects the
neighbour.

Each takes the house pattern already used by the protocol navigation:
a coarse pointer or a narrow window gets a 44 pixel minimum in both
directions. Desktop with a mouse is untouched. The two window rows that
did not wrap now do, because a thumb-sized pill is wider than its
label and the panel must not push sideways instead.

Verified: mobile gate clean on all four new routes across seven window
sizes; the visual matrix stays clean at 320, 375, and 1440 in both
themes.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Give Dogecoin and Zcash the full explorer surface Bitcoin has
Dogecoin returns up to a thousand pending transactions in one request.
Zcash refuses anything above two hundred as a bad request rather than
trimming it. The dashboard asked both for four hundred, so the Zcash
lens and its arrivals list were empty on every real load while every
fixture and every unit test passed: a fixture answers whatever it is
asked.

The ceilings now live beside the request that has to respect them and
are clamped where the URL is built, so no caller can exceed one.

Two things follow from finding it this way:

- live-e2e.mjs is added. It loads the local build and forwards only its
  API calls to a deployed origin, which is the cheapest check that can
  see a contract the two sides disagree about. It reports rather than
  asserts, because the deployment it reads is live and a chain in a
  genuine outage would fail assertions for telling the truth.
- The fault panel's own styling moved into the shared chain-page
  partial. It had stayed behind in the old component, so the dashboard
  rendered "Why Dogecoin is not ready" at browser-default heading size,
  outranking the page title.

Verified against the live origin: both dashboards render the lens, the
timeline and every panel with no failure notice, over real blocks and
real pool attribution.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@bitcoinuniverseadmin bitcoinuniverseadmin changed the title Promote: the source entry documentation that follows the two host-side corrections Promote: the Dogecoin and Zcash parity surfaces Aug 30, 2026
Bitcoin Universe and others added 4 commits August 30, 2026 18:29
The gate this replaces rendered a Markdown table from the recorded JSON
and compared it against the committed Markdown, so the only thing it
could ever prove was that a file agreed with itself. While it was green,
production served thirty-eight protocols and the recorded roster here
said thirty-six: dunes and zrc20 were added to the registry in
backend-apis, served publicly, and nothing in this repository noticed.
The README was wrong in the same way, naming three readable protocols
for as long as six had been readable.

The roster is owned by backend-apis, which now publishes it as a named
document: manifest schema, registry version, the repository that owns it
and the commit it was built from. This pins that document and holds four
things to it.

  --check, offline, on every commit:
    the pin carries its provenance, or it is not a pin;
    the readable list in the README and the coverage table are generated
      from it;
    PROTOCOL-ROSTER.lock records every published id, so a protocol
      leaving the roster has to be an edit rather than an absence;
    every protocol this repository writes prose for or calls an API path
      for exists in the registry, on the chain the registry places it on,
      and every readable protocol has a path.

  --against <origin>, in the production smoke run:
    the served roster is compared field by field against the pin, and a
      protocol added, dropped, renamed, re-authorised or moved between
      chains is named rather than discovered later by a reader.

Twenty-three cases in protocol-contract.test.mjs, each one a state the
old gate was green for.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The comment in this job predicted this failure and named the fix. The
deep pass is routes times states times themes times widths, it was
measured at 47 minutes over seven routes on 2026-08-29, and it was
measured again today at 1h11m on run 33323262662. The job cap is 100
minutes. On develop it reached the cap: run 33320958080 was killed at
1h41m with the deep pass still running, so the required check for the
promotion pull request never produced a verdict at all, and the same
happened to its pull request run beside it.

Three shards, split by route because the cost is per route, sized from
the measurement rather than by counting names: graphs and mining, then
protocols and home, then blocks, transactions and addresses with the
chain failure states. About 20, 20 and 34 minutes of a 60 minute cap.
Each builds its own copy, which is what the mobile gate beside it already
does and for the same reason: the gates cannot make each other wait, and
each one can be read and run on its own.

Nothing is dropped. Every route, state, theme and width the pass covered
is still covered, and the broad pass, the forced-colour pass and the
bundle gates stay in the build job, which now fits in 45 minutes.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Escaping only the pipe leaves a value ending in a backslash able to
consume its own escape and split the row, so one cell reads as two. The
backslash goes first and a newline becomes a space, because a newline
ends the row outright. CodeQL flagged it as js/incomplete-sanitization on
the pull request that introduced it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Ask each chain for a pending set it will actually return
@bitcoinuniverseadmin

Copy link
Copy Markdown
Author

Promoting on the evidence for this exact tree, with one gap stated plainly.

develop 78fcdfb has a tree byte-identical to 9ff8a50, the head of #37, so these conclusions cover exactly the content being promoted: Backend build and test, Documentation gates, Mobile and adaptive layout, WebKit and Firefox, both CodeQL analyses, Analyze (rust) and Analyze (actions) all passed.

The ninth job, Frontend build, has no verdict on that head: merging #37 cancelled it through the workflow's cancel-in-progress for pull_request events. Its rerun on develop is queued behind a fleet with zero free linux-ultra runners and that job takes about ninety minutes once it starts.

What stands in for it, all run against this code: the production build, 410 universe unit tests, the parity regression gate, the mobile gate across seven window sizes, 92 visual-matrix screenshots at 320, 375 and 1440 in both themes with no overflow, console, accessibility or contrast finding, and the four artifact gates (branding, third-party origins, asset presence, em dash). The release artifact job runs the production build and those four gates again on a clean checkout, so a real gate stays in the path to production, and the public-origin acceptance pass runs after cutover.

The develop run is still going. If it fails, this rolls back to mempool-a2ae43884.

Bitcoin Universe and others added 11 commits August 30, 2026 19:16
Exiting from the catch while a keep-alive socket was still being torn
down aborted the process with a libuv assertion and an exit code of 127
instead of the 1 the failure means. Both fail a job, so CI was never
wrong, but a gate whose exit code depends on which machine ran it is a
gate nobody can reason about. The body is now read either way, so nothing
holds the connection, and the failure sets the exit code and lets the
process end on its own.

Measured before: exit 127 on Windows against the live origin. After: 1.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Run 33330398257 passed every gate in the frontend job and then reported a
failure:

  ##[error]Failed to CreateArtifact: Artifact storage quota has been hit.
  Unable to upload any new artifacts.

Nothing was wrong with the build. The deep pass uploads about fifty
megabytes of screenshots per run and the broad pass another seven, on
every run, green or not, and that is what filled the quota. Usage is
recalculated every six to twelve hours, so deleting faster does not fix
it; producing less does. 1.1 GB of artifacts from before 17:00Z were
deleted to clear the immediate block.

The screenshots are diagnostic. When a gate passes, nobody opens them;
when one fails, they are exactly what is needed. Both screenshot uploads
now run on failure, with `if-no-files-found: ignore` so a job that failed
before the pass ran does not fail twice for it.

Retention was already capped at three days by the repository, which every
run said in a warning while the file asked for thirty. It now asks for
what it can have.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
WebKit and Firefox was the one required check in this workflow that asked
for a GitHub-hosted runner. On 2026-08-30 the organization's plan stopped
providing them, and from about 19:39Z every run of this job failed while
the four self-hosted checks beside it kept passing. A required gate no
runner can accept blocks every merge in the repository, which is the same
failure as a gate that cannot finish.

It moves to `browser-heavy`, which already carries a browser and the
system libraries one needs. `playwright install --with-deps` wants root
and a runner account may not have it, so a refused dependency install
falls back to fetching the engines alone rather than failing a gate over
a permission.

Nothing about what is measured changes: the same WebKit window set and
the same Firefox subset, on the same routes.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
GitHub-hosted labels bypass the self-hosted fleet and the RunsOn AWS
overflow, and they are what consumed the organization's Actions minute
allowance. The official RunsOn images track the GitHub runner images closely,
so the toolchain is unchanged.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Run 33333310466 passed every measurement in "Mobile and adaptive layout"
and then failed on "Keep the mobile report". The Actions artifact quota
is full, so any upload attempt fails the step, and a required check that
is green in substance reports red.

The two screenshot uploads were already narrowed to failure. These are
the three that were left: the mobile report, the engine reports, and the
chain page smoke. Same rule, same reason. On failure the upload may still
be refused, but the job is failing already, so nothing changes about the
verdict.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
# Conflicts:
#	.github/workflows/universe-ci.yml
The conflict in universe-ci.yml was one line, the runner target for the
third-engine job, and resolving it by taking the whole file from develop
threw away everything else on this branch: the sharded visual matrix, the
artifact policy, and the step that runs the new roster gate. The run that
followed proved it, failing on a step named for a script this branch
deletes.

The file is this branch again, with develop's RunsOn target for
mobile-engines kept.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
backend-apis main 100c0ec0 is live. It promotes op_inscriptions from
BLOCKED to VERIFIED READ ONLY, which production supports:
/api/v1/universe/sources reports index-opinscriptions ready, zero blocks
behind, zero consecutive failures.

So the pin is re-recorded from the deployed origin: seven protocols
readable rather than six, and the sourceSha is the commit production is
running. --against now agrees with what is served.

The README count test derives its numbers from the pin instead of
spelling them out, so the next roster change is a regenerate rather than
an edit to a test.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…30-181216

Hold the protocol roster to the registry that owns it
The transaction reading now carries each input's and output's asset
inventory: protocol chips with the asset's own name (the id when no name
exists), exact quantities shifted by the asset's own decimals, links to
the protocol detail routes, and a named coverage state whenever emptiness
was not proven. Protocol actions stop being bare labels: they carry the
asset, the exact quantity, and the outpoints the action touched.

Address pages gain an asset holdings panel fed by the new holdings
endpoint: aggregates across unspent outputs, address-level ledger
balances in their own clearly explained section so a quantity is never
counted twice, an assets column on the unspent output table, the privacy
boundary verbatim for shielded Zcash addresses, and honest notes when a
reading is partial, unscanned, or out of an authority's coverage.

Protocol copy that called Doginals and DRC-20 another chain's business is
corrected, and the six chain protocols that had no copy at all get real
descriptions. The visual matrix fixtures exercise a multi-asset output, a
proven-empty output, an unscanned output, and both holdings views.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…-20260830-2110

Show every provable protocol asset on chain transaction and address pages
@bitcoinuniverseadmin

Copy link
Copy Markdown
Author

Taking this promotion forward (session mempool-30). develop is now 803cfa9: on top of the parity surfaces this adds the roster contract pin (#40), the truthful Bitcoin address states and backend address index (#42), the chain pending-set fix (#37), and the cross-chain transaction/address asset visibility (#44) whose overlay side is already deployed and live-verified at backend-apis-8c3e1cec. CI state and the evidence for each constituent are recorded on their PRs; the plan outage and its procedure are documented on #44 and in backend-apis#107. Cutover will follow release.sh with its own deployed-configuration gates, which are the checks that actually bind for a release.

@bitcoinuniverseadmin
bitcoinuniverseadmin merged commit 2d88cef into main Aug 30, 2026
10 of 22 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant